#include <pthread.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <thread>
#include <vector>

using namespace std;

#define NUM 5  // 定义线程数量

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int cnt = 0;  // 共享变量，用于计数

void *Count(void *args) {
  uint64_t number = (uint64_t)args;
  pthread_detach(pthread_self());
  printf("The thread %lu running...\n", number);
  while (true) {
    pthread_mutex_lock(&mutex);
    while (cnt == 0 || cnt % 2 != 0) {
      pthread_cond_wait(&cond, &mutex);
    }
    printf("I am thread-%lu , the cnt is %d\n", number, cnt);
    pthread_mutex_unlock(&mutex);
    sleep(1);
  }
  return nullptr;
}

int main() {
  for (uint64_t i = 0; i < NUM; ++i) {
    pthread_t tid;
    pthread_create(&tid, nullptr, Count, (void *)i);
    usleep(100);
  }
  while (true) {
    pthread_mutex_lock(&mutex);
    ++cnt;
    if (cnt % 2 == 0) {
      pthread_cond_signal(&cond);
      pthread_mutex_unlock(&mutex);
    } else
      pthread_mutex_unlock(&mutex);
    sleep(1);
  }

  return 0;
}

// -------------------------------------------------

// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

// int cnt = 0;  // 共享变量，用于计数

// void *Count(void *args) {
//   uint64_t number = (uint64_t)args;
//   pthread_detach(pthread_self());  // 将线程分离，自动回收资源
//   printf("The thread %lu running...\n", number);
//   while (true) {
//     pthread_mutex_lock(&mutex);  // 获取互斥锁，进入临界区
//     // 在获取锁后，调用pthread_cond_wait，进入条件变量的等待队列
//     pthread_cond_wait(&cond, &mutex);
//     // 被唤醒后，重新获取互斥锁，执行以下代码
//     printf("I am thread-%lu , the cnt is %d\n", number, cnt++);
//     pthread_mutex_unlock(&mutex);  // 释放互斥锁，离开临界区
//   }
//   return nullptr;
// }

// int main() {
//   // 创建多个线程
//   for (uint64_t i = 0; i < NUM; ++i) {
//     pthread_t tid;
//     // 创建线程并传递其编号
//     pthread_create(&tid, nullptr, Count, (void *)i);
//     usleep(100);  // 确保每个线程都有时间启动
//   }

//   while (true) {
//     pthread_cond_signal(&cond);  // 主线程每秒唤醒一个等待的线程
//     sleep(1);                    // 暂停1秒，避免唤醒速度过快
//   }

//   return 0;
// }
//
